#3. 请使用已学习的装饰器相关知识自己实现functools.lru_cache。
#返回值哈希字典：{hash值:函数返回值,......}
#hash值计算涉及到：函数名,位置参数,关键字参数

import time

def lru_cache(wrapped):
    ret_hash_dict = dict()
    def wrapper(*args, **kwargs):
        hash_v = hash((wrapped.__name__, args, tuple(kwargs)))
        if(hash_v in ret_hash_dict):  #如果哈希值在返回值哈希字典中，直接赋值结果不计算
            ret = ret_hash_dict[hash_v]
        else:                                    #否则计算，并把哈希值和返回值加入字典
            ret = wrapped(*args, **kwargs)
            ret_hash_dict[hash_v] =  ret
            print(ret_hash_dict)        
        return ret
    return wrapper

@lru_cache   #add = lru_cache(add)
def add(x, n):
    time.sleep(3)
    return x**n


add(5, 10)
